package xuecheng.tool.http;

import java.util.Map;

/**
 * http 工具类
 *
 * @author PengXueCheng
 * @version 1.0.0
 */
public interface HttpUtils {

    /**
     * 发送 GET 请求
     *
     * @param url
     *            请求 URL
     * @param headers
     *            请求头(HTTP报头的名称是不区分大小写)
     * @return http 响应结果
     */
    SimpleEvent get(String url, Map<String, String> headers);

    /**
     * 发送 GET 请求
     *
     * @param url
     *            请求 URL
     * @return http 响应结果
     */
    SimpleEvent get(String url);

    /**
     * 发送 POST(content-type: application/json;)
     *
     * @param url
     *            请求 URL
     * @param contentObject
     *            请求 URL 参数对象
     * @return http 响应结果
     */
    SimpleEvent post(String url, Object contentObject);

    /**
     * 发送 POST(content-type: application/json;)
     *
     * @param url
     *            请求 URL
     * @param content
     *            请求 URL 参数
     * @return http 响应结果
     */
    SimpleEvent post(String url, String content);

    /**
     * 发送 POST 请求, 并且添加 指定 header
     *
     * @param url
     *            请求 URL
     * @param content
     *            请求 URL 参数
     * @param headers
     *            请求头(HTTP报头的名称是不区分大小写)
     * @return http 响应结果
     */
    SimpleEvent post(String url, String content, Map<String, String> headers);

    /**
     * 发送 POST 请求, 并且添加 指定 header
     *
     * @param url
     *            请求 URL
     * @param content
     *            请求 URL 参数字节数组
     * @param headers
     *            请求头(HTTP报头的名称是不区分大小写)
     * @return http 响应结果
     */
    SimpleEvent post(String url, byte[] content, Map<String, String> headers);

    /**
     * 发送指定 mediaType POST 请求, 并且添加 指定 header
     *
     * @param url
     *            请求 URL
     * @param content
     *            请求 URL 参数
     * @param mediaType
     *            请求类型
     * @param headers
     *            请求头(HTTP报头的名称是不区分大小写)
     * @return http 响应结果
     */
    SimpleEvent post(String url, String content, String mediaType, Map<String, String> headers);

    /**
     * 发送指定 mediaType POST 请求, 并且添加 指定 header
     *
     * @param url
     *            请求 URL
     * @param content
     *            请求 URL 参数字节数组
     * @param mediaType
     *            请求类型
     * @param headers
     *            请求头(HTTP报头的名称是不区分大小写)
     * @return http 响应结果
     */
    SimpleEvent post(String url, byte[] content, String mediaType, Map<String, String> headers);

    /**
     * media type 定义
     */
    class StrMediaType {

        /**
         * "application/x-www-form-urlencoded"，是默认的MIME内容编码类型，一般可以用于所有的情况，但是在传输比较大的二进制或者文本数据时效率低。
         * 这时候应该使用"multipart/form-data"。如上传文件或者二进制数据和非ASCII数据。
         */
        public static final String MEDIA_TYPE_NORAML_FORM = "application/x-www-form-urlencoded;charset=utf-8";
        /**
         * 既可以提交普通键值对，也可以提交(多个)文件键值对。
         */
        public static final String MEDIA_TYPE_MULTIPART_FORM = "multipart/form-data;charset=utf-8";
        /**
         * 只能提交二进制，而且只能提交一个二进制，如果提交文件的话，只能提交一个文件,后台接收参数只能有一个，而且只能是流（或者字节数组）
         */
        public static final String MEDIA_TYPE_STREAM = "application/octet-stream";
        /**
         * 文本格式
         */
        public static final String MEDIA_TYPE_TEXT = "text/plain;charset=utf-8";
        /**
         * json 格式
         */
        public static final String MEDIA_TYPE_JSON = "application/json;charset=utf-8";

    }

}
